home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 551-575 / disk_562 / intuisup / editor / source.lzh / save.c < prev    next >
C/C++ Source or Header  |  1991-09-22  |  7KB  |  264 lines

  1.         /*************************************
  2.          *                                   *
  3.          *             Editor v1.0           *
  4.          *   by Torsten Jürgeleit in 08/91   *
  5.          *                                   *
  6.          *              Save part            *
  7.          *                                   *
  8.          *************************************/
  9.  
  10.     /* Includes */
  11.  
  12. #include "includes.h"
  13. #include "defines.h"
  14. #include "imports.h"
  15. #include "protos.h"
  16.  
  17.     /* Save project */
  18.  
  19.    SHORT
  20. save_project(VOID)
  21. {
  22.    struct TemplateList   *tl = &template_list;
  23.    struct Template       *tp;
  24.    struct FileRequester  *freq = project_file_requester;
  25.    BPTR   fh;
  26.    BYTE   path[LONG_DSIZE + LONG_FSIZE + 1];
  27.    USHORT len;
  28.    SHORT  status = EDITOR_STATUS_NORMAL;
  29.  
  30.    /* Display ARP file requester and check if user selected cancel */
  31.    freq->fr_FuncFlags |= FRF_DoColor;
  32.    freq->fr_Hail       = PROJECT_SAVE_HAIL_TEXT;
  33.    if (FileRequest(freq)) {
  34.  
  35.       /* Prepare file name and project name */
  36.       len = strlen(freq->fr_File) - 4;
  37.       if (Strcmp(freq->fr_File + len, ".tpl")) {
  38.      strcpy(&tl->tl_ProjectName[0], freq->fr_File);
  39.      strcat(freq->fr_File, ".tpl");
  40.       } else {
  41.      strncpy(&tl->tl_ProjectName[0], freq->fr_File, (size_t)len);
  42.      tl->tl_ProjectName[len] = '\0';
  43.       }
  44.  
  45.       /* Build full path for project file */
  46.       strcpy(&path[0], freq->fr_Dir);
  47.       TackOn(&path[0], freq->fr_File);
  48.  
  49.       /* Check if file already exists and inform user */
  50.       if (fh = Open(&path[0], (LONG)MODE_OLDFILE)) {
  51.      Close(fh);
  52.       }
  53.       if (!fh || ok_cancel_requester(" Save ", "File already exists."
  54.                  " Do you really want to overwrite?") == TRUE) {
  55.  
  56.      /* Open file and write project header */
  57.      if (!(fh = Open(&path[0], (LONG)MODE_NEWFILE))) {
  58.         status = EDITOR_ERROR_OPEN_FAILED;
  59.      } else {
  60.         if ((status = write_project_header(fh)) == EDITOR_STATUS_NORMAL) {
  61.  
  62.            /* Save all templates */
  63.            for (tp = get_head(&tl->tl_List); tp && status ==
  64.             EDITOR_STATUS_NORMAL; tp = get_succ(&tp->tp_Node)) {
  65.           status = write_template(fh, tp);
  66.            }
  67.  
  68.            /* If any error then delete incomplete project file */
  69.            if (status != EDITOR_STATUS_NORMAL) {
  70.           DeleteFile(&path[0]);
  71.            } else {
  72.           tl->tl_Flags &= ~TEMPLATE_LIST_FLAG_CHANGED;
  73.            }
  74.         }
  75.         Close(fh);
  76.      }
  77.       }
  78.    }
  79.    if (status != EDITOR_STATUS_NORMAL) {
  80.       show_error(status);
  81.    }
  82.    return(status);
  83. }
  84.     /* Write project header to save file */
  85.  
  86.    STATIC SHORT
  87. write_project_header(BPTR fh)
  88. {
  89.    SHORT status;
  90.  
  91.    if (FPrintf(fh,
  92.         "BEGIN PROJECTHEADER\n"
  93.         "   LEFTEDGE=%d\n"
  94.         "   TOPEDGE=%d\n"
  95.         "   WIDTH=%d\n"
  96.         "   HEIGHT=%d\n"
  97.         "   FLAGS=%d\n"
  98.         "END PROJECTHEADER\n", pwin->LeftEdge, pwin->TopEdge,
  99.         pwin->Width, pwin->Height, template_list.tl_Flags) == -1L) {
  100.       status = EDITOR_ERROR_WRITE_FAILED;
  101.    } else {
  102.       status = EDITOR_STATUS_NORMAL;
  103.    }
  104.    return(status);
  105. }
  106.     /* Write template data to save file */
  107.  
  108.    STATIC SHORT
  109. write_template(BPTR fh, struct Template  *tp)
  110. {
  111.    struct Box         *box = &tp->tp_Box;
  112.    struct TextAttr    *ta = &tp->tp_TextAttr;
  113.    struct BorderData  *bd;
  114.    struct TextData    *td;
  115.    struct GadgetData  *gd;
  116.    struct Node        *node;
  117.    BYTE  *fmt;
  118.    UBYTE type = tp->tp_Type;
  119.    SHORT status = EDITOR_STATUS_NORMAL;
  120.  
  121.    /* Write standard data */
  122.    if (FPrintf(fh,
  123.         "BEGIN TEMPLATE\n"
  124.         "   NAME=\"%s\"\n"
  125.         "   TYPE=%d\n"
  126.         "   FLAGS=%d\n"
  127.         "   BEGIN BOX\n"
  128.         "      X1=%d\n"
  129.         "      Y1=%d\n"
  130.         "      X2=%d\n"
  131.         "      Y2=%d\n"
  132.         "   END BOX\n", &tp->tp_TemplateName[0], type,
  133.                tp->tp_Flags, box->bo_X1, box->bo_Y1, box->bo_X2,
  134.                                box->bo_Y2) == -1L) {
  135.       status = EDITOR_ERROR_WRITE_FAILED;
  136.    } else {
  137.  
  138.       /* Write text list if any */
  139.       if (type == TEMPLATE_TYPE_MX || type == TEMPLATE_TYPE_CYCLE ||
  140.                        type == TEMPLATE_TYPE_LISTVIEW) {
  141.      if (FPrintf(fh, "   BEGIN TEXTLIST\n") == -1L) {
  142.         status = EDITOR_ERROR_WRITE_FAILED;
  143.      } else {
  144.         for (node = get_head(&tp->tp_TextList); node &&
  145.             status == EDITOR_STATUS_NORMAL; node = get_succ(node)) {
  146.            if (FPrintf(fh, "      TEXT=\"%s\"\n", node->ln_Name) == -1L) {
  147.           status = EDITOR_ERROR_WRITE_FAILED;
  148.            }
  149.         }
  150.         if (status == EDITOR_STATUS_NORMAL) {
  151.            if (FPrintf(fh, "   END TEXTLIST\n") == -1L) {
  152.           status = EDITOR_ERROR_WRITE_FAILED;
  153.            }
  154.         }
  155.      }
  156.       }
  157.  
  158.       /* Write template data */
  159.       if (status == EDITOR_STATUS_NORMAL) {
  160.      switch (TEMPLATE_GROUP(tp)) {
  161.         case TEMPLATE_GROUP_BORDER :
  162.  
  163.            /* Write border data */
  164.            bd = &tp->tp_Data.tp_BorderData;
  165.            if (FPrintf(fh,
  166.             "   BEGIN BORDERDATA\n"
  167.             "      TYPE=%ld\n"
  168.             "   END BORDERDATA\n", bd->bd_Type) == -1L) {
  169.           status = EDITOR_ERROR_WRITE_FAILED;
  170.            }
  171.            break;
  172.         case TEMPLATE_GROUP_TEXT :
  173.  
  174.            /* Write text data */
  175.            td = &tp->tp_Data.tp_TextData;
  176.            if (td->td_Type == TEXT_DATA_TYPE_TEXT) {
  177.           fmt = "   BEGIN TEXTATTR\n"
  178.             "      NAME=\"%s\"\n"
  179.             "      YSIZE=%d\n"
  180.             "      STYLE=%d\n"
  181.             "      FLAGS=%d\n"
  182.             "   END TEXTATTR\n"
  183.               "   BEGIN TEXTDATA\n"
  184.             "      TYPE=%d\n"
  185.             "      FLAGS=%d\n"
  186.             "      TEXT=\"%s\"\n"
  187.             "   END TEXTDATA\n";
  188.            } else {
  189.           fmt = "   BEGIN TEXTATTR\n"
  190.             "      NAME=\"%s\"\n"
  191.             "      YSIZE=%d\n"
  192.             "      STYLE=%d\n"
  193.             "      FLAGS=%d\n"
  194.             "   END TEXTATTR\n"
  195.               "   BEGIN TEXTDATA\n"
  196.             "      TYPE=%d\n"
  197.             "      FLAGS=%d\n"
  198.             "      TEXT=%ld\n"
  199.             "   END TEXTDATA\n";
  200.            }
  201.            if (FPrintf(fh, fmt, ta->ta_Name, ta->ta_YSize, ta->ta_Style,
  202.                     ta->ta_Flags, td->td_Type, td->td_Flags,
  203.                               td->td_Text) == -1L) {
  204.           status = EDITOR_ERROR_WRITE_FAILED;
  205.            }
  206.            break;
  207.         case TEMPLATE_GROUP_GADGET :
  208.  
  209.            /* Write gadget data */
  210.            gd = &tp->tp_Data.tp_GadgetData;
  211.            if (FPrintf(fh,
  212.             "   BEGIN TEXTATTR\n"
  213.             "      NAME=\"%s\"\n"
  214.             "      YSIZE=%d\n"
  215.             "      STYLE=%d\n"
  216.             "      FLAGS=%d\n"
  217.             "   END TEXTATTR\n"
  218.             "   BEGIN GADGETDATA\n"
  219.             "      TYPE=%ld\n"
  220.             "      FLAGS=%ld\n", ta->ta_Name, ta->ta_YSize,
  221.                     ta->ta_Style, ta->ta_Flags, gd->gd_Type,
  222.                              gd->gd_Flags) == -1L) {
  223.           status = EDITOR_ERROR_WRITE_FAILED;
  224.            } else {
  225.           if (!gd->gd_Text) {
  226.              fmt = "      TEXT=%ld\n";
  227.           } else {
  228.              fmt = "      TEXT=\"%s\"\n";
  229.           }
  230.           if (FPrintf(fh, fmt, gd->gd_Text) == -1L) {
  231.              status = EDITOR_ERROR_WRITE_FAILED;
  232.           } else {
  233.              if (gd->gd_Type == GADGET_DATA_TYPE_STRING) {
  234.             fmt = "      SPECIAL1=%ld\n"
  235.                   "      SPECIAL2=%ld\n"
  236.                   "      SPECIAL3=\"%s\"\n";
  237.              } else {
  238.                 fmt = "      SPECIAL1=%ld\n"
  239.                   "      SPECIAL2=%ld\n"
  240.                   "      SPECIAL3=%ld\n";
  241.              }
  242.              if (FPrintf(fh, fmt, gd->gd_SpecialData.gd_Data.gd_Data1,
  243.                     gd->gd_SpecialData.gd_Data.gd_Data2,
  244.                   gd->gd_SpecialData.gd_Data.gd_Data3) == -1L) {
  245.             status = EDITOR_ERROR_WRITE_FAILED;
  246.              } else {
  247.             if (FPrintf(fh, "   END GADGETDATA\n") == -1L) {
  248.                status = EDITOR_ERROR_WRITE_FAILED;
  249.             }
  250.              }
  251.           }
  252.            }
  253.            break;
  254.      }
  255.       }
  256.       if (status == EDITOR_STATUS_NORMAL) {
  257.      if (FPrintf(fh, "END TEMPLATE\n") == -1L) {
  258.         status = EDITOR_ERROR_WRITE_FAILED;
  259.      }
  260.       }
  261.    }
  262.    return(status);
  263. }
  264.